
#include <string>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
//函数对象:即一个重载了括号操作符“（）”的对象。当用该对象调用此操作符时，其表现形式如同普通函数调用一般，因此取名叫函数对象
//函数对象可以保存函数函数调用状态，如:调用一次改变某个状态的值
//函数对象(function object)又叫仿函数(functor)，就是重载了调用运算符()的类，所生成的对象，就叫做函数对象/仿函数。因为重载了()之后，我们就能像函数一样去使用这个类，同时类里面又可以储存一些信息，所以要比普通的函数更加灵活
template <typename T>
class ShowElement
{
public:
	T t;
	//每调用一次，t都会改变
	void operator()(T &t)
	{
		this->t = t;
		cout << t << endl;
	}
	void print()
	{
		cout << t << endl;
	}
};
void fun_obj()
{
	int a = 100;
	ShowElement<int> show_element;
	show_element(a); //形式很像普通函数的调用,

	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//函数对象作为参数，是值传递，不是引用传递
	for_each(v.begin(), v.end(), show_element);
	//还是100，说明函数对象做参数是值传递，实参的函数对象不会改变
	show_element.print(); //100


	//如果需要改变函数对象的状态，可以将返回值(返回值就是函数对象)赋值给该函数对象
	show_element = for_each(v.begin(), v.end(), show_element);
	show_element.print(); //9
}
int main1()
{
	fun_obj();
	return 0;
}

